package day0807;

import java.util.ArrayList;
import java.util.List;
/**
 * 荣耀第二题：
 * 类似力扣第68题 https://leetcode-cn.com/problems/text-justification/
 * */
public class WenBenDuiQi {
    public List<String> fullJustify(String[] words, int maxWidth) {
        String[] space = new String[maxWidth+1];//0-maxWidth个空格字符串
        StringBuffer s = new StringBuffer();
        for(int i=0;i<maxWidth+1;i++){//初始化space数组 使存的空格数与下标一致
            space[i] =s.toString();
            s.append(" ");
        }
        List<String> pWords = new ArrayList<>();//存放最后结果
        for(int i=0;i<words.length;i++){//遍历整个words，一行一行的排版
            int curlen = words[i].length();//记录当前已读单词的长度，当>=maxWidth时进行排版
            int startI = i;
            while(i<words.length-1 && curlen<maxWidth){
                i++;
                curlen = curlen+words[i].length()+1;//每多读一个单词都要加一个空格
            }
            if(curlen>maxWidth){//当前长度>maxWidth，说明已经多读了一个单词
                curlen = curlen-words[i].length()-1;
                i--;
            }
            pWords.add(processCurLine(words,startI,i,curlen,maxWidth,space));//排版
        }
        return pWords;
    }
    //排版
    public String processCurLine(String[]words,int si,int ei,int curlen,int maxWidth,String[]space){
        StringBuffer sb = new StringBuffer();//用来进行排版
        int map = ei-si;//记录单词之间 有几个间隙
        int addSpace = maxWidth-curlen+map;//记录这一行总共有多少空格
        if(map == 0){//间隙为0，证明只有一个单词
            sb.append(words[ei]);
            sb.append(space[addSpace]);
            return sb.toString();
        }
        if(ei == words.length-1){//证明要排版最后一行了，格式特殊
            for(int i=si;i<ei;i++){
                sb.append(words[i]).append(" ");
            }
            sb.append(words[ei]);//最后一个单词不用加上空格
            sb.append(space[addSpace-map]);//如果还有多余空格，一起加上
            return sb.toString();
        }
        int allAddSpace = addSpace/map;//所有的空格数/间隙 = 每个间隙必加的空格数（均匀分布）
        int left = addSpace % map +si;//多出来的几个要从si开始，依次加在间隙中
        for(int i=si;i<ei;i++){
            sb.append(words[i]).append(space[allAddSpace]);
            if(i<left){//<left就要多加一个空格
                sb.append(" ");
            }
        }
        sb.append(words[ei]);
        return sb.toString();
    }
}